http 分块传输编码详解

前言

分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由网页服务器发送给客户端应用( 通常是网页浏览器)的数据可以分成多个部分。分块传输编码只在HTTP协议1.1及以上版本中提供。通常,HTTP应答消息中发送的数据是整个发送的,Content-Length消息头字段表示数据的长度。数据的长度很重要,因为客户端需要知道哪里是应答消息的结束,以及后续应答消息的开始。然而,使用分块传输编码,数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小。对于数据大小未知的情况下,使用分块传输编码是非常有用的。

Content-Length 全量传输

Content-Length:65535 表示当前传输的数据总大小为65535个字节,当服务器或客户端从body中读取了这么多字节之后,就认为数据已经读取完毕了。这是与Transfer-Encoding 分块传输是完全不同的一种数据传输方式。

example:

HTTP/1.1 200 OK[CRLF]
Content-Type: text/plain[CRLF]
Content-Length: 25[CRLF]
[CRLF]
Mozilla Developer Network ——> body 数据内容,大小为25字节

Transfer-Encoding 分块传输

当请求头或响应头部中含有Transfer-Encoding: chunked时,Content-Length头将会被忽略,不起作用;同时每个块的开始处以16进制数值表示当前块的数据大小,后是\r\n;然后是当前chunk的数据内容,后是\r\n;终止块是一个常规块,但长度为零。当读取到chunk 的数据大小是0时,意味着请求或响应数据已经分块传输完毕。

example:

HTTP/1.1 206 OK[CRLF]
Content-Type: text/plain[CRLF]
Transfer-Encoding: chunked[CRLF]
[CRLF]
7[CRLF] ——> 第一个chunk块,大小为7字节
Mozilla[CRLF] ——> 第一个chunk块内容
9[CRLF] ——> 第二个chunk块,大小为9字节
Developer[CRLF] ——> 第二个chunk块内容
7[CRLF] ——> 第三个chunk块,大小为7字节
Network[CRLF] ——> 第三个chunk块内容
0[CRLF] ——> 标记性终止块,大小为0字节
[CRLF]

PS:由于数据是分块传输的,服务器或客户端刚开始可能只接受到了部分chunk块,直到读取到终止块时,才认为请求或响应数据已经读取完毕。Http-Code=206 表示分块传输。

参考链接

  1. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding
  2. https://imququ.com/post/transfer-encoding-header-in-http.html